# -*- coding: utf-8 -*-
"""
Created on Thu Mar 28 16:38:14 2019

写入、读取、追加excel文件内容

Python 3.6.3
@author: ikaros
"""

from openpyxl import Workbook
from openpyxl import load_workbook
#from xlutils.copy import copy #只能用于旧的xls文件
#import xlrd #只能用于旧的xls文件
import os
import re
import numpy as np

#data_file = 'name.txt'
#first=[]
'''读取txt文件内容'''
def read_txt(data_file):
    '''data_file即需要读取的txt文件'''
    '''
    使用的方法及条件：
    1、首先有一个txt文件；
    2、文件里姓名和学号用空格分开；
    3、把该文件和txt放在同一文件夹下；
    4、最终结果，生成一个数组，第1列值为名字，第二列为学号
    '''
#    global first
    first=[]
    with open(data_file, 'r') as f1:
        for line in f1:
            line = line.strip()
            #print(type(line)) #debug
            line = line.split(' ') #按空格切分字符串
    #        print(line)          #debug
    #        line= np.array(line) #debug
    #        print(line.shape)    #debug
            first.append(line)    #把line放到first里
            
    first = np.array(first)       #把列表变成数组
    #print(first) #debug
    #print(first.shape)#debug
    row1,col1 = first.shape       #获取内容的行数和列数
    return first,row1,col1

'''把txt文件内容写入excel'''
def creat_xlsx_01(out_file,txt_content,row,col):
    '''
    data_file: 需要生成的文件的名字，如name.xlsx
    txt_content: 想要写入的内容
    row: 想要写入多少行
    col：想要写入多少列
    '''    
    workbook = Workbook() #创建或打开一个excel文件
    booksheet = workbook.active     #获取当前活跃的sheet,默认是第一个sheet
    #存一行数据
    #booksheet.append([11,87])
    for i in range(row):
        for j in range(col):
            '''写入内容'''
            booksheet.cell(row=i+1,column=j+1).value=txt_content[i,j] #行和列的标号是从1开始的
    '''注意输出的数字的类型是文本类型，需要打开文件手动改为数值类型'''
    workbook.save(out_file) #保存文件

'''读取Excel文件内容，并取出所有人的名字'''
def read_xlsx_01(data_file):
    #workbook = load_workbook('D:\\Py_exercise\\test_openpyxl.xlsx')
    #booksheet = workbook.active  #获取当前活跃的sheet,默认是第一个sheet
    second=[] #用于记录表格读取的内容
    third = [] #用于保存提取出来名字
    i = 0
    #workbook = load_workbook('name.xlsx') #打开文件
    workbook = load_workbook(data_file) #打开文件
    sheets = workbook.get_sheet_names()         #从名称获取sheet
    booksheet = workbook.get_sheet_by_name(sheets[0]) #第一个工作簿
    
    rows = booksheet.rows #一行的所有内容   
    '''
    #print(rows) #debug
    #columns = booksheet.columns
    #print(columns) #debug
    #通过坐标读取值
    #cell_11 = booksheet.cell('A1').value
    #print(cell_11)
    #cell_11 = booksheet.cell(row=1, column=1).value
    '''
    #迭代所有的行
    for row in rows:
        i = i+1 #计算一共多少行
        line = [col.value for col in row]
        second.append(line)
    #    print(line) #debug
    second = np.array(second) #转换成数组
    #print('second content:',second) #先打印出来看下内容，第一行可能不是我们需要的内容    
    
    row2,col2 = second.shape
    for i in range(row2):
        j=i+1
        if j >= row2 : #不能大于或等于行数
            break
        #print(second[j,0])
        third.append(second[j,0])
    #print(second.shape)
    third = np.array(third)
    #print('third',third.shape)
    #print('third content:',third)
    workbook.close()
    '''返回名字'''
    return third

'''excel文件中匹配对应的名字，并在其后面追加数据'''
def add_excel_01(array1,data_file,col):
    '''
    array1:     要查找的名称内容
    data_file:  要写入的文件名
    col:        要写在第几列
    '''
    #data_file = 'name.xlsx'
    b = read_xlsx_01(data_file)
    row = b.shape[0]
    data = load_workbook(data_file)
    print(data.get_named_ranges()) # 输出工作页索引范围
    print(data.get_sheet_names()) # 输出所有工作页的名称
    # 取第一张表
    sheetnames = data.get_sheet_names()
    table = data.get_sheet_by_name(sheetnames[0])
    table = data.active
    print(table.title) # 输出表名
    count1 = array1.shape[0]
    if count1 != 0:        
        for i in range(count1):        
            for j in range(row):
                if b[j] == array1[i]:
                    '''在对应名字后面追加1'''
                    table.cell(row=j+2,column=col).value = 2 #openpyxl这个包的(1,1)表示单元格A1，行数可根据实际情况修改
                    print(b[j])
    else:
        print('There is no name can be written')
    data.save(data_file) #必须要有这一句

'''获取某个文件夹下所有文件的名字，然后提取名字中的中文部分'''
#再次测试后发现无法使用，建议将for root,dirs,files in os.walk(files_dir): 这一句放到全局环境中使用
def find_Chinese_word(files_dir):    
    '''
    使用方式：
    1、files_dir尽量为英文，并放在程序目录下
    2、将需要统计的文件放在files_dir里面，
    3、运行该程序，
    4、返回一个数组，数组里全是中文名字
    '''    
    chinese_word = []
    '''找出路径下所有文件的名字，files即文件的名字'''
    '''
    re.sub()
    参考https://www.cnblogs.com/nkwy2012/p/6548812.html
    1、第一个参数是找到字符串中的内容，这里是"[A-Za-z0-9.\!\%\[\]\,\。]"
    2、第二个参数是将第一个参数内容替换成第二个参数
    3、第三个参数是要作用的对象
    '''    
    for root,dirs,files in os.walk(files_dir): #读取所有图片的地址和名字 
        '''使用.. 表示当前目录，如os.walk('..')'''
        '''root,dirs,files在使用os.walk后变成了全局变量，所以后面就会出错，无法使用'''
        print(files)   #debug
    files2 = np.array(files)             #files为list类型，这里转化为数组
        #print(files2.shape)      #debug #list没有shape、size的属性
        #print(files2.size)       #debug
    
    #print(files2.shape)
    row1 = files2.shape[0]
    for i in range(row1):
        str1 = files2[i]
        str2=re.sub("[A-Za-z0-9._\!\%\[\]\,\。]", "", str1)
        #print(str2)#debug
        if str2 == "": #把为空的名字去掉
            continue
        chinese_word.append(str2)
    
    chinese_word = np.array(chinese_word)
    print(chinese_word) #debug #一定要看下数据是否符合，是否有特殊字符在里面
    return chinese_word

'''获取某个文件夹下所有文件的名字，然后提取名字中的中文部分'''
def find_Chinese_word2(files2):    
  
    chinese_word = []
    '''
    re.sub()
    参考https://www.cnblogs.com/nkwy2012/p/6548812.html
    1、第一个参数是找到字符串中的内容，这里是"[A-Za-z0-9.\!\%\[\]\,\。]"
    2、第二个参数是将第一个参数内容替换成第二个参数
    3、第三个参数是要作用的对象
    '''    

    row1 = files2.shape[0]
    for i in range(row1):
        str1 = files2[i]
        str2=re.sub("[A-Za-z0-9._\!\%\[\]\,\。]", "", str1)
        #print(str2)#debug
        if str2 == "": #把为空的名字去掉
            continue
        chinese_word.append(str2)
    
    chinese_word = np.array(chinese_word)
    print(chinese_word) #debug #一定要看下数据是否符合，是否有特殊字符在里面
    return chinese_word

'''
#把txt的内容写入到xlsx文件
data_file = 'name.txt'
first,row1,col1 = read_txt(data_file)
outfile = 'te.xlsx'
creat_xlsx_01(outfile,first,row1,col1)
'''

'''
#读取Excel
data_file = 'name.xlsx'
read_xlsx_01(data_file)
'''

'''
#提取中文名字
files_dir='\file_name'
chinese_word = find_Chinese_word('files_dir')
'''

'''
#在Excel对应的名字后追加数据
name_find = np.array(['A','B'])
data_file = 'name.xlsx'
col = 3 #第三列 C列
add_excel_01(name_find,data_file,col)
'''

'''
#匹配中文，追加数据
files_dir='./name/'
data_file = 'name.xlsx'
chinese_word = find_Chinese_word('files_dir')
col = 3 #第三列 C列
add_excel_01(chinese_word,data_file,col)
'''

files_dir='./name/'
data_file = 'name.xlsx'
for root,dirs,files in os.walk(files_dir): #读取所有图片的地址和名字 
    '''使用.. 表示当前目录，如os.walk('..')'''
    '''root,dirs,files在使用os.walk后变成了全局变量，所以后面就会出错，无法使用'''
    print(files)   #debug    
files2 = np.array(files)

chinese_word = find_Chinese_word2(files2)
col = 3 #第三列 C列
add_excel_01(chinese_word,data_file,col)
















